package br.unisal.domain;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.unisal.repository.PedidoRepository;

public class Pedido {

	private Integer codigo;
	private Cliente cliente;
	private boolean ativo = false;
	@SuppressWarnings("unused")
	private Date dataPedido;
	//private PedidoPeriodo periodo;
	@SuppressWarnings("unused")
	private Date saidaEntrega;
	@SuppressWarnings("unused")
	private Date voltaEntrega;
	private List<ItemSolicitado> itensSolicitados = new ArrayList<>();
	private FormaDePagamento formaDePagamento;
	private Double taxaDeEntrega = 0.1;
	private Entregador entregador;
	private Double taxaDesconto;
	private double troco;

	public Pedido(Cliente cliente, List<ItemSolicitado> itensSolicitados, FormaDePagamento formaDePagamento) {
		this.codigo = PedidoRepository.getSequencialDosPedidos();
		PedidoRepository.setIncrementaSequencialDosPedidos();
		this.ativo = true;
		this.dataPedido = new Date();
		this.cliente = cliente;
		
		if (formaDePagamento != null) this.formaDePagamento = formaDePagamento;
		else this.formaDePagamento = FormaDePagamento.OUTROS;
		
		if (itensSolicitados != null) this.itensSolicitados = itensSolicitados;
		else this.itensSolicitados.add(new ItemSolicitado(new Produto(0, "", 0, "", 0.0, true), 0));
		
		this.setDesconto();
	}

	private void setDesconto() {
		if (this.formaDePagamento.equals(FormaDePagamento.DINHEIRO))
			this.taxaDesconto = 0.15;
		else if (this.formaDePagamento.equals(FormaDePagamento.CARTAODEBITO))
			this.taxaDesconto = 0.10;
		else if (this.formaDePagamento.equals(FormaDePagamento.CARTAOCREDITO))
			this.taxaDesconto = 0.05;
		else if (this.formaDePagamento.equals(FormaDePagamento.OUTROS))
			this.taxaDesconto = 0.00;
	}

	public Double getValorBrutoPedido() {
		Double valorTotalPedido = 0.0;
		if (itensSolicitados == null || itensSolicitados.size() == 0)
			return valorTotalPedido;
		else {
			for (ItemSolicitado itempedido : itensSolicitados) {
				valorTotalPedido += itempedido.getValorProduto()
						* itempedido.getQuantidade();
			}
			return valorTotalPedido;
		}
	}

	private Double getDescontoPedido() {
		return getValorBrutoPedido() * this.taxaDesconto;
	}

	public Double getCustoEntrega() {
		return getValorBrutoPedido() * this.taxaDeEntrega;
	}

	public Double getValorFinalPedido() {
		return getValorBrutoPedido() - getDescontoPedido() + getCustoEntrega();
	}

	public String getNomeClientePedido() {
		return this.cliente.getPrimeiroNome();
	}

	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public Entregador getEntregador() {
		return entregador;
	}

	public void setEntregador(Entregador entregador) {
		this.entregador = entregador;
	}

	@Override
	public String toString() {
		String saida = getCodigo() + "  " + getNomeClientePedido() + "   "
				+ getValorFinalPedido();
		return saida;
	}

	public void imprimeComanda() {

	}

	public Integer getCodigo() {
		return codigo;
	}

	public void setSaidaEntrega(Date saidaEntrega) {
		this.saidaEntrega = saidaEntrega;
	}

	public void setVoltaEntrega(Date voltaEntrega) {
		this.voltaEntrega = voltaEntrega;
	}

	public Double calculaTroco(Double valor) {
		this.troco = valor - this.getValorFinalPedido();
		return this.troco;
	}

//	@SuppressWarnings("unused")
//	private Pedido doProgramaFidelidade() {
//		this.taxaDesconto = 0.3;
//		return this;
//	}

//	public Pedido ativo() {
//		this.ativo = true;
//		return this;
//	}

	// public Pedido() {
	// // TODO Auto-generated constructor stub
	// }

}
